package com.ucode.cgms.service;

import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.ObjectUtil;
import com.ucode.cgms.mapper.CgmsCommissionFlowMapper;
import com.ucode.model.cgms.CgmsCommissionFlow;
import com.ucode.model.cgms.enums.CgmsSysResultCodeEnum;
import com.ucode.springboot.starter.mybatis.core.base.BaseService;
import com.ucode.tool.base.enums.GlobalResultCodeEnum;
import com.ucode.tool.exception.UcodeServiceException;
import com.ucode.tool.util.CollectionUtils;

import java.math.BigDecimal;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 佣金流水Service
 * @Author: Claude
 * @Date: 2023/05/26 14:10
 * @Version: 1.0
 */
public interface CgmsCommissionFlowService extends BaseService<Long, CgmsCommissionFlow, CgmsCommissionFlowMapper> {

    /**
     * 变更状态
     * @param ids 主键集合
     * @param status 状态值
     * @return 影响行数
     */
    int updateStatus(Collection<Long> ids, Integer status);
    
    /**
     * 获取ID与实体的映射关系
     * @param ids 主键集合
     * @return ID与实体的Map
     */
    default Map<Long, CgmsCommissionFlow> getMap(Collection<Long> ids) {
        return CollUtil.isEmpty(ids) ? new HashMap() : CollectionUtils.convertMap(this.selectByPrimaryKeys(ids), CgmsCommissionFlow::getId);
    }

    /**
     * 验证实体是否合法并返回
     * @param id 主键
     * @return 实体对象
     */
    default CgmsCommissionFlow validate(Long id) {
        if(ObjectUtil.isNull(id))
            throw new UcodeServiceException(GlobalResultCodeEnum.VALIDATE_FAILED);
        
        // 验证数据是否存在
        CgmsCommissionFlow entity = this.selectByPrimaryKey(id);
        if(ObjectUtil.isNull(entity) || entity.getDeltag()) {
            throw new UcodeServiceException(CgmsSysResultCodeEnum.COMMISSION_FLOW_NOT_EXISTS);
        }
        
        return entity;
    }

    /**
     * 创建佣金流水
     * @param userId 用户ID
     * @param orderId 订单ID
     * @param orderAmount 订单金额
     * @param amount 佣金金额
     * @param commissionType 佣金类型
     * @param commissionMode 佣金模式
     * @param returnPointAmount 返点金额
     * @param commissionAmount 抽成金额
     * @return 佣金流水ID
     */
    Long createCommissionFlow(Long userId, Long orderId, BigDecimal orderAmount,
                             BigDecimal amount, Integer commissionType, Integer commissionMode,
                             BigDecimal returnPointAmount, BigDecimal commissionAmount);
    
    /**
     * 批量创建佣金流水
     * @param list 佣金流水列表
     * @return 影响行数
     */
    int batchInsertCommissionFlow(List<CgmsCommissionFlow> list);
    
    /**
     * 在新事务中批量插入佣金流水
     * @param batchList 待插入的佣金流水批次列表
     * @return 影响的行数
     */
    int batchInsertWithNewTransaction(List<CgmsCommissionFlow> batchList);
    
    /**
     * 批量结算佣金
     * @param ids 佣金流水ID集合
     * @return 影响的行数
     */
    int batchSettle(Collection<Long> ids);
    
    /**
     * 批量取消佣金
     * @param ids 佣金流水ID集合
     * @return 影响的行数
     */
    int batchCancel(Collection<Long> ids);
    
    /**
     * 根据订单ID获取佣金流水列表
     * @param orderId 订单ID
     * @return 佣金流水列表
     */
    List<CgmsCommissionFlow> getCommissionFlowByOrderId(Long orderId);
} 